<?php
declare(strict_types=1);

namespace catcher;

use catcher\exceptions\CatchException;
use catcher\exceptions\FailedException;
use think\db\exception\DataNotFoundException;
use think\db\exception\ModelNotFoundException;
use think\exception\Handle;
use think\exception\HttpException;
use think\exception\HttpResponseException;
use think\exception\RouteNotFoundException;
use think\exception\ValidateException;
use think\facade\Log;
use think\Response;
use Throwable;

class CatchExceptionHandle extends Handle
{
    /**
     * 不需要记录信息（日志）的异常类列表
     * @var array
     */
    protected $ignoreReport = [
        HttpException::class,
        HttpResponseException::class,
        ModelNotFoundException::class,
        DataNotFoundException::class,
        ValidateException::class,
    ];

    /**
     * 记录异常信息（包括日志或者其它方式记录）
     *
     * @access public
     * @param Throwable $exception
     * @return void
     */
    public function report(Throwable $exception): void
    {
        // 使用内置的方式记录异常日志
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @access public
     * @param \think\Request $request
     * @param Throwable $e
     * @return Response
     * @throws \Exception
     */
    public function render($request, Throwable $e): Response
    {

        // 其他错误交给系统处理
        if ($e instanceof \Exception && !$e instanceof CatchException) {
            $e = new FailedException($e->getMessage(), 10005, $e);
        }

        if ($e instanceof \TypeError) {
            Log::error($e->getMessage());
            $e = new FailedException("请勿非法调用".$e->getMessage(), 10005);
        }

        $code = $e->getCode();
        if (method_exists($e, "getStatusCode")) {
            $code = $e->getStatusCode();
        }
        return CatchResponse::fail($e->getMessage(), $e->getCode(), $code);
    }

    /**
     * 重写异常渲染页面
     *
     * @time 2020年05月22日
     * @param Throwable $exception
     * @return string
     */
    protected function renderExceptionContent(Throwable $exception): string
    {

        /*  if ($previousException = $exception->getPrevious()) {
              $data = $this->convertExceptionToArray($previousException);
          } else {
              if (!is_object($exception)) {
                  throw new \Exception("Invalid exception provided.");
              }
              $data = $this->convertExceptionToArray($exception);
          }

          ob_start();
          $render = function () use ($data) { // 使用局部作用域和变量传递
              if ($this->app->config->get('app.exception_tmpl')) {
                  include $this->app->config->get('app.exception_tmpl');
              } else {
                  include __DIR__ . '/../../tpl/think_exception.tpl';
              }
          };
          $render();

          return ob_get_clean();*/
        return "";
    }
}
